"use strict";
/**
 * 泛型作用：
 * 动态类型，程序会自动推导出参数的类型，不用写重复性代码
 * @param arg
 * @returns
 */
// 返回值的类型和传入参数的类型相同
function identity(arg) {
    return arg;
}
// 我们定义了泛型函数后，可以用两种方法使用。 第一种是，传入所有的参数，包含类型参数：
// console.log(identity<string>('返回值'))
// 第二种方法更普遍。利用了类型推论 -- 即编译器会根据传入的参数自动地帮助我们确定T的类型：
// console.log(identity('字符串'))
// 使用泛型变量
function getLength1(arg) {
    console.log('参数的长度为:', arg.length);
    return arg;
}
function getLength2(arg) {
    console.log('参数的长度为:', arg.length);
    return arg;
}
// getLength1([1, 2, 3, 4, 5])
// getLength2([1, 2, 3, 4, 5, '6'])
// 泛型的默认类型
function qq(a, b) {
    return [a, b];
}
function identity2(arg) {
    return arg;
}
let genericIdentity = identity2;
let genericIdentity2 = identity2;
let genericIdentity3 = {
    msg: '123'
};
let genericIdentity4 = {
    msg: true
};
// 泛型类
// 泛型类看上去与泛型接口差不多。 泛型类使用（ <>）括起泛型类型，跟在类名后面。
class GenericNumber {
}
let myGenericNumber = new GenericNumber();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function (x, y) {
    return x + y;
};
// console.log(myGenericNumber.zeroValue)
// console.log(myGenericNumber.add(1, 6))
// 并不限制GenericNumber类使用的类型，也可以只用string，如下例：
let myGenericString = new GenericNumber();
myGenericString.zeroValue = '1';
myGenericString.add = function (x, y) {
    return x + y;
};
function getLength3(arg) {
    // console.log(
    //   '通过泛型约束，继承Lengthwise的length属性，就可以获取到length的值:',
    //   arg.length
    // )
    return arg;
}
//传入的参数必须是：符合约束类型的值 且 必须包含必须的属性，如length
// console.log(getLength3({length: 3, value: 'hhhhh'}))
// 在泛型约束中使用类型参数     <这里代码存在报错，我不知道怎么解决>
// 已解决:bilibili小满ts合集p18
// 引用数据类型obj记得用keyof
let p = {
    name: 'qq',
    sex: '男'
};
function getProperty(obj, key) {
    return obj[key];
}
let x = { a: 1, b: 2, c: 3, d: 4 };
console.log('getProperty:', getProperty(x, 'a'));
console.log(getProperty(p, 'name'));
// 结果：
// type D = {
//   name?: string | undefined;
//   sex?: string | undefined;
//   age?: number | undefined;
// }
/**
 * 泛型实战--xhr请求
 */
const axios = {
    get: function (url) {
        return new Promise((resolve, reject) => {
            let xhr = new XMLHttpRequest();
            xhr.open('GET', url);
            xhr.onprogress = function (env) {
                console.log('请求进度:', ((env.loaded / env.total) * 100).toFixed(2) + '%');
            };
            xhr.onreadystatechange = function () {
                // console.log('xhr:', xhr)
                if (xhr.status == 200 && xhr.readyState == 4) {
                    resolve(JSON.parse(xhr.responseText));
                }
            };
            xhr.send(null);
        });
    }
    // 写法二：
    // get<T>(url:string):Promise<T>{
    //   return new Promise((resolve,reject)=>{
    //   })
    // }
};
// axios.get<data>('./data.json').then((res) => {
//   // console.log('res:', res.message)
//   console.log('res:', res.dateCode)
// })
